#include<iostream>
using namespace std;
class A
{
friend ostream& operator<<(ostream& out,const A& th);
public:
	A(int n=2)
	{
		_num=n;
		cout<<"A(int n)"<<endl;
	}
	A(const A& a)
	{
		_num=a._num;
		cout<<"A(const A& a)"<<endl;
	}
	~A()
	{
		cout<<"~A()"<<endl;
	}
private:
	int _num;
};
ostream& operator<<(ostream& out,const A& th)
{
	out<<th._num;
//这里和下面的f1函数总共写一次<<endl就行
    return cout;
}
void f1(A aa)
{
	cout<<aa<<endl;//这里 
}
int main()
{
//注！！！：传参是拷贝构造 与A aa=5; 不同 后者应该是构造+拷贝  注！！！
	A a;
//调用构造函数
    f1(a);
//这里传参时 A aa=a; a本来就是A类型，不用类型转换，直接调用拷贝就行
//所以这里=是 构造+拷贝
//没有优化

    f1(A());
//构造+拷贝构造被编译器优化成了构造

    A aa1=1;
//构造+拷贝构造被编译器优化成了构造

//这里5能传参转换成A类型 
//是因为整型在A类里有对应的构造函数支持
    int a2=5; 
	f1(a2); 
//由于传参时 A aa=a2; a2为int类型 需要类型转换，需要调用构造函数创建临时变量，然后再用了拷贝构造
//最终会被编译器优化成 构造

	return 0;
}